

package cn.shengchao.examstar.distribute.ohs.local.appservice.impl;

import cn.shengchao.examstar.distribute.model.DistributeNodeRoleChainExistModel;
import cn.shengchao.examstar.distribute.ohs.local.appservice.DistributeNodeRoleChainExistLoader;
import cn.shengchao.examstar.rpc.base.TransResult;
import cn.shengchao.examstar.rpc.distribute.cs.UserCs;
import cn.shengchao.examstar.rpc.distribute.enums.DistributeDataStatusEnum;
import cn.shengchao.examstar.distribute.infrastrure.po.DistributeNodeInfo;
import cn.shengchao.examstar.distribute.infrastrure.service.DistributeNodeInfoService;
import cn.shengchao.examstar.distribute.infrastrure.service.DistributeUserInviteService;
import cn.shengchao.examstar.distribute.ohs.local.appservice.DistributeUserInviteDomainService;
import cn.shengchao.examstar.rpc.distribute.dto.UserInviteDto;
import cn.shengchao.examstar.rpc.base.exception.BaseRpcException;
import cn.shengchao.examstar.rpc.distribute.enums.DistributeSaleRoleEnum;
import cn.shengchao.examstar.rpc.distribute.enums.DistributeTypeEnum;
import cn.shengchao.examstar.rpc.distribute.req.DistributeJmsYgBatchInviteChangeReq;
import cn.shengchao.examstar.rpc.uddsys.req.DistributeUserInviteSaveDto;
import cn.shengchao.examstar.rpc.wecom.api.CpUserServiceInviteApi;
import cn.shengchao.examstar.rpc.wecom.dto.CpUserServiceInviteDto;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @program: examstarapi
 * @description: 分销业务综合处理类实现
 * @author: Xiong weiqiang
 * @create: 2025-03-25 11:59
 */
@Service
@RequiredArgsConstructor
public class DistributeUserInviteDomainServiceImpl implements DistributeUserInviteDomainService {
    private final DistributeNodeInfoService distributeNodeInfoService;
    private final DistributeUserInviteService distributeUserInviteService;
    private final DistributeNodeRoleChainExistLoader distributeNodeRoleChainExistLoader;
    @DubboReference
    CpUserServiceInviteApi cpUserServiceInviteDubboApi;
    /**
     * method : userInviteDistributeRecordIn
     * description : 给系统所有用户记录受邀的档案,受邀逻辑不在本记录处理，只记录邀请以及分销关系
     *
     * qst1: distributeUserId=0,inviteUserId=0 平台未分配学员
     * qst2: distributeUserId=0,inviteUserId!=0 邀请人的分销角色失效，需要查检查邀请人角色失效原因，学员也需要分配
     * qst3: distributeUserId!=0,inviteUserId=0 不应该存在
     * qst4: distributeUserId=0,inviteUserId!=0 不应该存在
     * 
     * @param userInviteDto \{@link UserInviteDto \}
     * @return : cn.shengchao.examstar.base.RpcResult
     * @author : Xiong weiqiang
     * @CreateDate : 2025-03-25 13:49:03
     * @Reviewed :
     * @UpdateLog : Name Date Reason/Contents
     *            ---------------------------------------
     *            **** **** ****
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void userInviteDistributeRecordIn(UserInviteDto userInviteDto) {
        if (userInviteDto == null) {
            throw new BaseRpcException("记录邀请信息时发生错误：用户邀请记录为空");
        }
        if (userInviteDto.getUserId() == null) {
            throw new BaseRpcException("记录邀请信息时发生错误：用户id为空");
        }
        //邀请人是平台的先排查
        if (UserCs.PLATFORM_USER_ID.equals(userInviteDto.getInviteUserId())) {
            //平台注册，没有邀请人的需要平台去分配给分销链的人
            userInviteDto.setDistributeUserId(UserCs.PLATFORM_USER_ID);
            //保存了，待平台分配。
            distributeUserInviteService.saveInviteRecord(userInviteDto);
            cpUserServiceInviteDubboApi.createUserServiceInviteRecord(CpUserServiceInviteDto.builder()
                    .serviceUserId(UserCs.PLATFORM_USER_ID)
                    .serviceCpUserId("")
                    .userId(userInviteDto.getUserId())
                    .serviceDistributeUserId(UserCs.PLATFORM_USER_ID)
                    .serviceDistributeCode(DistributeSaleRoleEnum.ROLE_YSXG.getCode())
                    .build());
        } else {
            //查询邀请人的分销节点信息
            DistributeNodeRoleChainExistModel existModel=distributeNodeRoleChainExistLoader.loadModelByUserId(userInviteDto.getInviteUserId(), DistributeTypeEnum.TYPE_SALE.getType());
            if (existModel.isExist()){
                DistributeNodeInfo distributeUserInfo=existModel.getDistributeNodeInfo();
                //初始为邀请人的用户id，加盟商体系的邀请人要判断一下最终服务的人是加盟商,剩下的平台会员和加盟商就是最终服务。
                Long userId= distributeUserInfo.getUserId();
                //如果是加盟商员工，则记录加盟商id
                if (distributeUserInfo.getDistributeRoleCode().equals(DistributeSaleRoleEnum.ROLE_DSPD_EMP.getCode())){
                    userId=distributeUserInfo.getAdminUserId();
                }
                //加盟商的会员，会员只能挂加盟商下面
                if (distributeUserInfo.getDistributeRoleCode().equals(DistributeSaleRoleEnum.ROLE_SLMB.getCode())
                        &&existModel.getUpLevelNodeInfo()!=null&&!UserCs.PLATFORM_USER_ID.equals(existModel.getUpLevelNodeInfo().getUserId())){
                    userId=existModel.getUpLevelNodeInfo().getUserId();
                }
                //员工，加盟商会员，邀请人inviteUserId分销角色作为分销节点，distributeUserId改变为加盟商或是平台会员，平台。

                //跟原来不同，加盟商下的会员distributeUserId也是加盟商了。
                userInviteDto.setDistributeUserId(userId);
                //谁邀请的，分配给谁。
                distributeUserInviteService.saveInviteRecord(userInviteDto);
                //邀请关系分配，员工的邀请关系分配给员工，记录员工的角色，serviceDistributeUserId记录供应商
                cpUserServiceInviteDubboApi.createUserServiceInviteRecord(CpUserServiceInviteDto.builder()
                        .userId(userInviteDto.getUserId())
                        .serviceUserId(userInviteDto.getInviteUserId())
                        .serviceDistributeCode(distributeUserInfo.getDistributeRoleCode())
                        .serviceDistributeUserId(userId)
                        .build());
            }else {
                //正常逻辑，只有平台是没有分销节点的。如果了排除了平台邀请人后，还没有查到邀请节点，有问题，先记录，后面看会不会有这种情况。

                userInviteDto.setDistributeUserId(UserCs.PLATFORM_USER_ID);
                //如果分销负责是平台，但又有邀请人，则保存邀请记录，待平台检查邀请人角色失效原因后分配。
                distributeUserInviteService.saveInviteRecord(userInviteDto);
                cpUserServiceInviteDubboApi.createUserServiceInviteRecord(CpUserServiceInviteDto.builder()
                        .userId(userInviteDto.getUserId())
                        .serviceUserId(userInviteDto.getInviteUserId())
                        .serviceDistributeUserId(UserCs.PLATFORM_USER_ID)
                        .serviceDistributeCode(DistributeSaleRoleEnum.ROLE_YSXG.getCode())
                        .build());
            }
        }

    }

    @Override
    public TransResult<String> updateUserInviteRecord(DistributeUserInviteSaveDto userInviteSaveDto) {
        DistributeNodeRoleChainExistModel existModel=distributeNodeRoleChainExistLoader.loadModelByUserId(userInviteSaveDto.getUserId(), DistributeTypeEnum.TYPE_SALE.getType());
        if (!existModel.isExist()){
            if (userInviteSaveDto.getDistributeUserId()!=0){
                DistributeNodeInfo distributeUserInfo = distributeNodeInfoService.getOne(Wrappers
                        .lambdaQuery(DistributeNodeInfo.class).eq(DistributeNodeInfo::getDistributeType, DistributeTypeEnum.TYPE_SALE.getType())
                        .eq(DistributeNodeInfo::getUserId, userInviteSaveDto.getInviteUserId())
                        .eq(DistributeNodeInfo::getDataStatus, DistributeDataStatusEnum.STATUS_CURT.getStatus()));
                if (distributeUserInfo == null){
                    return TransResult.fail("处理更新邀请时：用户不存在推广分销节点");
                }
                if (distributeUserInfo.getDistributeRoleCode().equals(DistributeSaleRoleEnum.ROLE_DSPD_EMP.getCode())){
                    userInviteSaveDto.setDistributeUserId(distributeUserInfo.getAdminUserId());
                }else if (distributeUserInfo.getDistributeRoleCode().equals(DistributeSaleRoleEnum.ROLE_MKMG.getCode())){
                    return TransResult.fail("处理更新邀请时：市场经理不能作为邀请用户");
                }else{
                    //不是员工和市场经理，就是自己
                    userInviteSaveDto.setDistributeUserId(distributeUserInfo.getUserId());
                }
            }else{
                userInviteSaveDto.setInviteUserId(UserCs.PLATFORM_USER_ID);
                userInviteSaveDto.setDistributeUserId(UserCs.PLATFORM_USER_ID);
            }
            distributeUserInviteService.updateWxInviteRecord(userInviteSaveDto);
            return TransResult.success("保存成功");
        }else {
            return TransResult.fail("保存用户邀请关系时发生错误：学员存在分销关系，请使用分销用户的管理进行换绑");
        }

    }
    @Transactional
    @Override
    public TransResult<String> batchUpdateUserInviteRecordForJmsYg(DistributeJmsYgBatchInviteChangeReq jmsYgBatchInviteChangeReq) {
        DistributeNodeRoleChainExistModel existModel1=distributeNodeRoleChainExistLoader.loadModelByUserId(jmsYgBatchInviteChangeReq.getUserId(), DistributeTypeEnum.TYPE_SALE.getType());
        DistributeNodeRoleChainExistModel existModel2=distributeNodeRoleChainExistLoader.loadModelByUserId(jmsYgBatchInviteChangeReq.getReplaceUserId(), DistributeTypeEnum.TYPE_SALE.getType());
        if (existModel1.isExist()&&existModel2.isExist()){
            if (!existModel1.getDistributeNodeInfo().getDistributeRoleCode().equals(DistributeSaleRoleEnum.ROLE_DSPD_EMP.getCode())){
                return TransResult.fail("批量更改员工的学员邀请关系时发生错误："+"被替换用户非员工");
            }
            if (!existModel2.getDistributeNodeInfo().getDistributeRoleCode().equals(DistributeSaleRoleEnum.ROLE_DSPD_EMP.getCode())){
                return TransResult.fail("批量更改员工的学员邀请关系时发生错误："+"替代员工非员工");
            }
            UserInviteDto userInviteDto = new UserInviteDto();
            userInviteDto.setInviteUserId(jmsYgBatchInviteChangeReq.getReplaceUserId());
            userInviteDto.setDistributeUserId(existModel2.getUpLevelNodeInfo().getUserId());
            distributeUserInviteService.batchUpdateUserInviteRecordForJmsYg(jmsYgBatchInviteChangeReq.getUserId(),userInviteDto);
        }else {
            return TransResult.fail("批量更改员工的学员邀请关系时发生错误："+(existModel1.isExist()?"员工不存在分销关系":"替代员工不存在分销关系"));
        }
        return TransResult.success("批量更改成功");
    }
}